package tests;


import commons.Utils;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.IOException;
import java.time.Duration;

/**
 * Created with IntelliJ IDEA.
 * Description :
 * User: jiume
 * Date: 2025-09-07
 * Time: 18:45
 */
// 登录页面UI自动化测试
public class LoginPage {
    public static final String url = "http://134.175.206.246:9090/login.html";

    public static WebDriver driver;

    public LoginPage() {
        // 1、创建浏览器驱动对象
        driver = createWebDriver();
        // 2、设置隐式等待为3秒
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        // 3、访问url
        driver.get(url);
    }

    /**
     * 创建浏览器驱动对象
     * @return 返回创建好的驱动对象
     */
    private WebDriver createWebDriver() {
        if (driver == null) {
            // 自动下载驱动
            WebDriverManager.chromedriver().setup();
            // 添加配置：
            // 允许访问所有链接
            ChromeOptions options = new ChromeOptions();
            options.addArguments("--remote-allow-origins=*");
            // 也可以禁用自动化提示条
            options.setExperimentalOption("excludeSwitches", new String[]{"enable-automation", "enable-logging"});
            options.setExperimentalOption("useAutomationExtension", false);
            // 创建驱动对象
            driver = new ChromeDriver(options);
        }
        return driver;
    }


    /**
     * 检查页面元素是否可以正常显示
     */
    public void checkLoginPageRight() throws IOException {
        // 强制等待页面元素渲染完成
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        String app_title = driver.findElement(By.cssSelector("body > div > div.app-title")).getText();
        String welcome = driver.findElement(By.cssSelector("body > div > h1")).getText();
        String username = driver.findElement(By.cssSelector("#username")).getAttribute("placeholder");
        String password = driver.findElement(By.cssSelector("#password")).getAttribute("placeholder");
        String button = driver.findElement(By.cssSelector("#loginForm > button")).getText();
        String markedWord = driver.findElement(By.cssSelector("body > div > div.switch-link")).getText();

//        System.out.println(app_title);
//        System.out.println(welcome);
//        System.out.println(username);
//        System.out.println(password);
//        System.out.println(button);
//        System.out.println(markedWord);

        assert "音乐播放器".equals(app_title) && "欢迎回来".equals(welcome)
                && "请输入用户名".equals(username) && "请输入密码".equals(password)
                && "立即登录".equals(button) && "还没有账号? 注册".equals(markedWord);

        Utils.getScreenShot(driver, "checkLoginPageRight");
    }


    /**
     * 模拟登录失败的场景
     */
    public void LoginFail() throws IOException {
        // 测试用例1：不符合要求的账号、密码
        // 用户名：lisi、密码：123
        driver.findElement(By.cssSelector("#username")).sendKeys("lisi");
        driver.findElement(By.cssSelector("#password")).sendKeys("123");
        driver.findElement(By.cssSelector("#loginForm > button")).click();
        // 当执行完点击之后，程序立即去寻找对应的弹窗了，但是系统还并未出现弹窗，因此得显示等待弹窗的出现
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(2));
        wait.until(ExpectedConditions.alertIsPresent());
        // 切换到弹窗
        Alert alert = driver.switchTo().alert();
        // 验证弹窗文本信息
        String warning = alert.getText();
//        System.out.println(warning);
        assert "登录失败! 用户名或密码的长度小于6".equals(warning);
        // 确认弹窗
        alert.accept();
        Utils.getScreenShot(driver, "LoginFail");

        // 清空输入框
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        // 测试用例2：符合要求的账号、不符合要求的密码
        // 用户名：wangwu、密码：123
        driver.findElement(By.cssSelector("#username")).sendKeys("wangwu");
        driver.findElement(By.cssSelector("#password")).sendKeys("123");
        driver.findElement(By.cssSelector("#loginForm > button")).click();
        // 等待弹窗的出现
        wait.until(ExpectedConditions.alertIsPresent());
        // 切换到弹窗
        alert = driver.switchTo().alert();
        // 验证弹窗文本信息
        warning = alert.getText();
//        System.out.println(warning);

        assert "登录失败! 用户名或密码的长度小于6".equals(warning);
        // 确认弹窗
        alert.accept();
        Utils.getScreenShot(driver, "LoginFail");
    }


    /**
     * 模拟登录成功的场景
     */
    public void loginSuccess() throws IOException {
        // 先得清空输入框
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        // 测试用例：符合要求的账号、密码
        // 用户名：zhangsan、密码：123456
        driver.findElement(By.cssSelector("#username")).sendKeys("test123456");
        driver.findElement(By.cssSelector("#password")).sendKeys("123456");
        driver.findElement(By.cssSelector("#loginForm > button")).click();

        // 等待弹窗出现
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(2));
        wait.until(ExpectedConditions.alertIsPresent());

        // 切换到弹窗
        Alert alert = driver.switchTo().alert();
        String warning = alert.getText();
//        System.out.println(warning);
        assert "登录成功! 欢迎回来!".equals(warning);
        alert.accept();

        Utils.getScreenShot(driver, "loginSuccess");
    }


    /**
     * 退出浏览器
     */
    public void quit() {
        driver.quit();
    }
}
